package modelo.componentes;

/**
 * Permite la transferencia de Fuerza desde el motor hacia
 * la transmision, tiene logica de multiplicacion de Fuerza
 * @author grupo5
 * @version 1
 * @see Componente
 */
public class CajaDeCambios extends Componente {

		private Motor motor;
		private int cantCambios;
		private int cambio;
		private double xPrevia;
		
		
		/**
	     * Constructor de la clase 
		 * @param vidaUtil la vida util del componente
		 * @param masa la masa del componente
		 * @param precio el precio del componente
		 * @param cantCambios cantidad de cambios total de la caja 
		 */
		public CajaDeCambios(double vidaUtil, double masa, double precio, 
				int cantCambios) {
			
			super(TipoComponente.CAJA_DE_CAMBIOS, vidaUtil, 
					masa, precio);
			this.motor = null;
			this.cantCambios = cantCambios;
			
		}
		
		/**
	     * Constructor de la clase 
		 * @param vidaUtil la vida util del componente
		 * @param masa la masa del componente
		 * @param precio el precio del componente
		 * @param cantCambios cantidad de cambios total de la caja 
		 */
		public void setMotor(Motor motor) {
			
			this.motor = motor;
			
		}
		
		/**
	     * permite que el componete que lo referencia
	     * obtenga la fuerza que transmite 
		 * @return fuerza producto operaciones internas y salida de comp.relac
		 */
		public double obtenerFuerza() {
			
			double tick = 1.0 / this.motor.getFuerzaMax();
			this.xPrevia += tick;
			double x = this.xPrevia;
			x = this.fncCaja(x, 
				((Integer) this.cantCambios).doubleValue(), 
				((Integer) this.cambio).doubleValue());
			return (x * this.motor.obtenerFuerza() * 10.0);
			
		}
		
		/**
	     * funcion de apoyo interna 
		 * @param x poscion var indep
		 * @param cantTotCambios cantidad total de cambios como double
		 * @param cambActual cambio actual como double
		 * @return salida de la funcion 
		 */
		private double fncCaja(double x, double cantTotCamb, 
				double cambActual) {
			
			double y = 0.0;
			double pto1 = ((cambActual - 1) / cantTotCamb);
			double pto2= ((cambActual - 0.5) / cantTotCamb);
			double pto3= (cambActual / cantTotCamb);

			if (cambActual > 0) {
				if (x < 0) {
					y = 0;
				} else if ((x >= 0) && 
						(x < pto1)) {
					y = x;
				} else if ((x >= pto1) && 
						(x <  pto2)) {
					y = 2.0 * x;
				} else if (x >=  pto2) {
					y =  pto3;
				}
				
			}
			return y;
			
		}
		/**
	     * obtiene la cantidad de cambios con la que se definio la caja 
		 * @return cantidad de cambios 
		 */
		public double getCantCambios() {
			
			return this.cantCambios;
		}
		
		/**
	     * obtiene el cambio actual 
		 * @return cambio actual 
		 */
		public int getCambio() {
			
			return this.cambio;
			
		}
		
		/**
	     * funcion de apoyo interna 
		 * @param cambio nueva posicion de cambio a setear
		 * @return true si se pudo setear el nuevo cambio, de lo contr. false 
		 */
		public boolean ponerCambio(int cambio) {
			
			boolean exitoAlSetCambio = false;
			if ((cambio >=0) && (cambio <= this.cantCambios)) {
				this.cambio = cambio;
				exitoAlSetCambio = true;
			}
			return exitoAlSetCambio;
			
		}
		
}